{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "# Plot multi-class SGD on the iris dataset\n",
    "\n",
    "\n",
    "Plot decision surface of multi-class SGD on iris dataset.\n",
    "The hyperplanes corresponding to the three one-versus-all (OVA) classifiers\n",
    "are represented by the dashed lines.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Automatically created module for IPython interactive environment\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXIAAAEICAYAAABCnX+uAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOydd3hUVfrHP2dKZtJ7KKFJVUQEGyirgIXiYt1VZC2rrmLHVWwgwoIKuIIFlV3B9tNVVteCFbGCoiIWELECCimU9D6ZTDm/P+4kJGHuZGZyM5NyPs/Do5l7yntvJu+cOfd7v6+QUqJQKBSKjosp2gEoFAqFonWoRK5QKBQdHJXIFQqFooOjErlCoVB0cFQiVygUig6OSuQKhULRwVGJvBMghFgjhPhrEO2qhBD9IxFTuAghhgghNgshKoUQM6IdD4AQ4hwhRK7v+o1s47meEULcE+D4bCHEE2GMO04Ikde66BTtFZXII4QQYpcQwuFLUGVCiM+FEFcLIVr9O5BSTpZS/l8Q7RKklL+1dr425jZgnZQyUUq5LNrB+FgCXO+7fpsjNam/5CulXCilvCJSMYSLEOJwIcR7QohS3/v9GyHE6Y2OJwohHvD9XVQLIXKEEC8LIY5r1Eb6jlUJIYqFEB8KIaZG54zaNyqRR5YzpJSJQF9gMXA78GR0Q2ofCCEsvv/tC/wQzVj80B5jau+8CbwPdAOygBlABYAQwgZ8BBwBTAGSgMOA/wKnNxvnSCllAjAEeAZ4VAgxLwLxdyyklOpfBP4Bu4BTm712HOAFhvl+tqGt/nKA/cC/gdhG7c8CtqD9QewEJvleXwdc4fv/gcB6oBwoAl5s1F8CA33/nww8CxQCu4E5gMl37FJggy+WUuB3YHKAc7sdyAcqgV+AU3yvPwPc06jdOCCv2TW5HdgKONH+uD1ALVAFDAb+CGz2nXMu8I9mc/8B+Bwo8x2/NJhr2WwMk+/8dwMFvuuS7BujynfdqoGdOv0lcC2w3XcN7gYGAF/44n4JiGl8bf30H9j4mgHxgMP3/qjy/esJ/AP4T4DfRRrwNLDH97tbrXPt7/C9hyqBH4FzGh3z+x4CBPCg7xqV+35vw/zEkOE7pxSdGK8A9gLxLfzNNFyXRq/92ff+SI/233R7+qdW5FFESrkJyANO9L10H1ryGoH2x5QNzAXwfeV8FrgVSAFOQkuEzbkbeA9IBXoBj+hM/whasuoPjAUuAS5rdHwUWlLOAP4JPCmEEM0HEUIMAa4HjpXat42JOnHpMQ0tWadIKU8GPuXANsavaAn0ErRz/iNwjRDibN/cfYA1vnPJRLtuW3zj6l5LP1zq+zfedz0SgEellE6prQZBWxkOCHAek4CjgdFo20MrgAuB3sAw33kGjZSyGpgM7PFdiwQp5Z4guj4HxAGHo62EH9RptxPtfZcMzAf+I4To4Tum9x6agPa+G4z2+5gKFPsZuxjY4RvzbCFEt2bHTwXW+s4xVF4HLGiLIIUPlcijzx4gzZckrwRuklKWSCkrgYXABb52fwOeklK+L6X0SinzpZQ/+xnPhbYV0FNKWSul3NC8gRDCjPZHOEtKWSml3AUsBS5u1Gy3lHKllNID/B/QA+1rcnM8aCvXoUIIq5Ryl5RyZwjnv0xKmSuldPg7KKVcJ6X83nfOW4FVaB88oCXKD6SUq6SULillsZRySxDXsjkXAg9IKX+TUlYBs4ALGm33BMN9UsoKKeUPwDbgPd945WgfNm16kxTAl4gnA1dLKUt912S9v7ZSyv9JKff4ruuLaN8m6pOj3nvIBSQChwJCSvmTlHKvn7El2ofiLrT31V4hxCdCiEG+JhnAvkZxj/Dto1cIIX4JdI5SShfat4S0lq9I10El8uiTDZSgrSjjgG98b+oy4F3f66Ct7IJJkLehfQXeJIT4QQhxuZ82GUAM2lZCPbt9sdTT8Icmpazx/W8CzZBS7gD+jvaVv0AI8V8hRM8g4qwnN9BBIcQoIcTHQohCIUQ5cLUvftC/Ji1dy+b05OBrYcH/B5ce+xv9v8PPzwddu9YihPi370ZglRBiNtr1KJFSlgbR9xIhxJZG12cYB66r3/eQlPIj4FHgMWC/EGKFECLJ3/hSyjwp5fW+bzF90b5ZPes7XIy2MKhvu0VKmQKci7YoCBS3Fe33WNLSOXYlVCKPIkKIY9GS5wa0VYYDOFxKmeL7l9zoq30u2r5rQKSU+6SUV0opewJXAcuFEAObNSviwKqrnj5o+9whI6V8QUr5B994Em1bA7Q/3rhGTbv7697C8C8AbwC9pZTJaHvd9Vs8etekpWvZnD0cfC3cNE3GRtHkmggh/F2TegJeGynl1Y22XRaiXY80IURKoH5CiL7ASrQtsXRfEt2G77oGeg9JKZdJKY9G27oZjLbVFxApZS5a8h/me+lDYIIQIr6lvn44C+13symMvp0WlcijgBAiSQgxBe0u/X/qtw7Q/rgeFEJk+dplCyEm+ro9CVwmhDhFCGHyHTvUz9jnCSF6+X4sRUsGnsZtfNslLwH3+mRgfYGbgf+EcS5DhBAn+5QItWgJtH6+LcDpQog0X8L6e6jjo32VL5FS1vruE/yl0bHngVOFEOcLISxCiHQhxIggrmVzVgE3CSEOEUIkoG3DvCildIcRb0t8Bxzu206wo32T0WM/kC6ESA5mYN82xxq0xJsqhLAKIU7y0zQe7X1RCCCEuIwDSVb3PSSEONb3DcmK9oFUS7P3lq9/qhBivhBioO+9mgFcDmz0NXkW7Wbna0KIYUIIs+9aHKN3br730IVoHwj3SSn97c13WVQijyxvCiEq0VZOdwIP0PQG4+1oN4k2CiEqgA/QZFf1N0YvQ7t5VY6mKmi8iqznWOBLIUQV2kr2Rinl737a3YD2x/gb2jeCF4CnwjgnG5qUsghtOyYLmO079hxa4tqFdvPsxTDGvxZY4Ltuc9E+gACQUuagydVmon3V3gIc6Tusey398JQv1k/QFDq1aNfHcHw3cBf44tmOdu312v6M9iHzm28LJJgtq4vRvm39jKYuOejDU0r5I9re9RdoHxZHAJ81aqL3HkpC+4AsRdt+KkZTBjWnDujnO8cKtNW+E+2GMlLKWrQ99B+Bt31tfvHNe36zsb7zxbEDTe1yk5RS76Z1l0Vo9yUUCoVC0VFRK3KFQqHo4KhErlAoFB0clcgVCoWig6MSuUKhUHRwQnlyLSC+pwW/BvKllFMCtU1MSZOZPXsFaqJQKNqIqtwKkmKaSuQralMRwkuirTxKUSmCYWdJbZGU8qAH2wxL5MCNwE9oEqWAZPbsxb3Pv2Pg1ApF5yPeuZKE2iUUJG1CBiclb5ENN65h4ogH0NSBGh//fiYPb1zE0T0/Yc5J13Cwo46ivXDWqp93+3vdkK0V38MDfwRCNrxXKBT+MXtzAROy5bVRUGy4cQ0Tez3Q9LWcSSz7ciFHdPuS28b8XSXxDopRK/KH0PwZEvUaCCGmA9MBMrpn6zVTKBQ+zN4cPKY+GJFd4+8/jYnNdjM35p3C0s/v59CMzdx50nXYLM5Wz6OIDq1ekfseNS+QUn4TqJ2UcoWU8hgp5TGJqcq4TKFoCbM3F4+pd5uNv6t0CAPTfuCusVdjt/g1n1R0EIxYkY8BzhRaGSc7kCSE+I+U8iIDxlYouiZSYvHuxmkZ23LbFoi//7QmP7s8VqxmFxccsZxzhz5BjLmu1XOYYpNIP/0qYjJ7Q+urF3ZtpJe6wlyK33kcr6MiqC6tTuRSyllo/s0IIcYBt6gkrlC0ljqqbNOpM49q1SjNk/gPBUfz0Mb7uPOka+iXst2QJA6QfvpV9Dx0BEl2K37qjyhCQEpJRXo6cBWFr9wfVB8jVSsKhcIohI0q+22tGqJ5Ev+l6EgWrH+cjLh9pNiMtfOOyeytkrhBCCFIslspygx+W83QRC6lXIdWP1KhULQCIcsAYZjscGfJUOavW0GKvYgF4y8nJdZgF1hhUkncQIQQIW1Rqc0shaIdEu98hm4VR4CsDblvQuqqJqvx/Ip+zPv4CeJjKrnn5MtIjyswMlRFO0AlcoWiHWL25uAV3UDYQ+qXkLoKObuprXxG3F6Oy/6IBeMvIzP+oBKbXZIXXl7N3v2d5wNNJXKFoh1i9ubgNvUJqU/zJL6/KpuqukRsFiczRs+hR2LA8qhdihdefZ19+wujHYZhqJudCkU7xOLNwWkZE1Kf+eufpb50TkF1T+788Fl6Je3kH+OnGx+gARQVl5CTv4c+2T3JSG/9syXVNTVcdsMt7Nm3H4/Hy63XX0X/vr25c+H9VFfXkJ6WymP/vIcvv9nMlu9/YPrNd2C323jv5f+w6Zst3LV4KW63m6OGD2Ppgruw2WL4xz8f5N0P12E2mzn5Dydw9+xbWPPhOpY+toI6l4u0lGRWPLiYrIyMlgNsQ1QiVyjaG7IWk9ynPdUZJEu3TmbuWq3EaHFNFnd99DQ1rnguOfLBtoqyVbz8xrvMmLUQq7UPLlcOjyyezZ/OmNSqMT/85DN6ZGXx0pPLASivrOS8y67hhceXkZGexqtvvcs9S5fx6H13s/K5Vdx9xy2MHH44tU4n1942h9f/8wQDD+nH1TNn89QLL3LBOWfy9nsfsen9NxBCUF6habqPP2Yk77/yPEIInn3xFZateJp7ZrdYg7pNUYlcoWh3SCrs91JnObLlpjRN4qWODOZ89AzltWksOPly+qf91JaBhkVRcQkzZi3EUbsOR+1wYCs33DGOsScc16qV+dAhg7hr0VLm3fcAE08eS0pSEj9v38E5f9W+kXg8HrpnHWQcyPbfdtG3dzYDD+kHwLRzz+SJ//yXKy+ehs0Ww4xZ85gw/iQmjtcezsrft5/LZ9zKvoJCXC43fXtF33JEJXKFor0hYqmxXRxU08ZJHODRTXdTXNONf4y/ksHp37dVhK0iJ38PVmsfXxIHGI7F0puc/D2tSuQDD+nHutdf5L11n7Dg/ocZ/4fjOXTQAN57+fnAHXXqFlssFj58dRXrP9/Iq2+9y8pnV/HG809y+/xFXHv5JZx+6ng2bPyKxcuWhx2zUaibnQpFO8PszcXi+Qmkt8W2q2eXNfn5qmPuZt64qxia+W1bhddq+mT3xOXKAbb6XtmK251Ln+yerRp37/4CYmPtTD37DG644q98vWUrRcWlbPp2CwAul4ufft0BQEJ8PFXV1QAMGnAIOXl7+G1XDgAvrn6TMccdQ1V1DRWVlUwYfxKL7rqd73/6GYCKyip6dssCYNWrr7cqZqNQK3KFop0R5/w/4uueYV/SrwHbnTjleL4dm0B1XQLv7riAcw57kqz4PWTF74lQpOGRkZ7GI4tnc8Md47BYeuN25/LI4tmtvuH54y/bmbt4KSaTCavFwtIFd2GxmLl9wSIqKqvweDxcfelFHDZ4IH/501ncfNfdDTc7H7vvbi69YWbDzc7L/nI+peXlXHjVDGqdTqSULLxTe9L2jhnXcOkNM+nRrRvHjBjO7rx8Iy5LqxBS52tFW9J/6HCpCksoFP5JqZ6OxbuDosSPdNvUJ3GHK45/rFvJ9uIj+OeECxiY9mMEIz1A9jWPMiC7W0h9jFatdDZ25u8n/1/XN3ntrFU/fyOlPKZ5W7UiVyjaGRZvTkD72vok7nTbueeT5fxafCS3nHBz1JJ4uGSkp6kEbhBqj1yhaE9IeaCghA49n/8TdZ4YFn76CD8UHMuNo+9gTJ/3Ihikor2hErlC0Y4QsgwTlbqJfGr5Et5asZZdZUP4sfBorj/uLsb1eyvCUSraG2prRaFoR0hhpyTuGdymAQcdm1q+hDcfX4sQMDj9ex4/YyJpsZ3nMXNF+KhErlC0J0QsTuspB7184pTjef3EJB75chHDsr7i1AGvqiSuaEBtrSgU7QiL53tsro8Oekglf/l7LP9qPh/vOpuy2vQoRador6hErlC0I+LqnifZcRM0KtIwILeS+bdu5oPf/sz5hy/nz4evjGKEXYeFDz7Kus++CLnfho1fMfWK69ogIn3U1oqiQ1BRWkzhnlwye/YmKbXzrkgtzRQrA3IrWXjbRtZsv4xzDn2SvxzxSBSj63xIKZFSYjIdvKadfdP1fnoYj9vtxmJpXSpWiVzR7vl8zRusWDAHs7UvHtdups+7hxMmnRntsNoEszcHl1kzy5pavoS3/ruWBNtV/HHwc/x1xBI6UzU1Ix8ImnffA/TO7skVF10AwOKHl5MQH4/X62X1O2tx1tUxZcIpzPr7deTk5XPe5dfwh9HH8dXm7/jPvx9m8UOPsfn7HxECLjrvHK69/BKuvfVOJp48lrMmT+Dbrdu4Y8FiahwObDExrH7uCaxWCzPvupvN3/+AxWLh3tm3cuLxxzWJq7SsnOtvv4tduXnExcby4L1zGXboEBY/vJx9+wvIyd9DWmoKTzz0z1adv9paUbRrKkqLWbFgDnXOdTiqNlPnXMeK+XOoKDW45mR7QLoxe/MbHgb62x3aA3znH/44Vx61sFMl8VffeIdRJ03klkuuZNRJE3n1zdY96f2nKZN57e13G35e/c5aMtJS+W3Xbj58bRWfvvUyW7b9yGebvgY0x8MLzjmDT978HyUlpezdX8AX777G52te48I/n91k7Lo6F5fPuIXFc+9gw9uv8NqzK4m123jiuf8C8Pma13jiofu45tY7qXU6m/Rd9NBjDD/8MD5751XumjmDa265s+HYlm0/8vzjy1qdxMGARC6EsAshNgkhvhNC/CCEmN/qqBQKH4V7cjFb+wIHnPLMlj4U7ul81W7Mci8CN25TX9Zevor/fXsGeyr7AnSqJF5UXMKts+bxcW0t31ZW8XFtLbfeMY+i4pKwxxx++GEUFZewd38B3//0C8lJSfzw8698tOELTjrjPMaeeT7bd/7eYIzVO7snx47Uvvn069OLXbl53PaPhXywfgOJCQlNxt7+++90y8zkqOHDAEhKTMBisbDx62+ZevYZAAwe0J/e2T3Z8fuuJn03frOZqWdPAeCkE0ZRUlpGeWUlAJNPHU+sPbRSfnoYsbXiBE6WUlYJIazABiHEGinlRgPGVnRxMnv2xuPajeaUp3lXe9w5ZPbUf4S9o+IR3SlMeI8n/lbHe1v/yIl93qZbfOf7wMrJ30Nfq4XhvrrSw4E+FkurbWzPnHQab6x5n/1FRfxpyiRy8vdw09V/47K/nN90/rx84mJjG35OSU7m07de4aNPP+OJ//yX1e+s5dH77m44LqXUqto3IxifKn9tBNpYjWNoLa1ekUuNKt+PVt+/yDtxKTolSanpTJ93DzG2ccTGjyDGNo7p8+7pnDc8hZXiVSW8t/WPjO71Pn8//g7MppatbDsafbJ7stvlbmRiCzlud6ttbM+dMplX3lrDG2ve58zJEzj5xDE8//JqqqprANizbz+FRQdvyRWXlOL1ejlz0mncedP1fPdD02Icg/v3Z19BAd9u3QZAZVU1brebE447mv+98TYAO37fRd6evQw65JAmfU849mj+97rWZsPGr0hPSyUpsemK3wgMudkphDAD3wADgceklF/6aTMdmA6Q0T36FTUUHYcTJp3JsFFjOr1qJX/rZ3z8cwXH9FzHLSfMxGJyt9ypA5KRnsb9i+cz/o552krc7eb+xfNbfcPzsMEDqaqupke3LLpnZdI9K5Nfd/zGhD9fCEBCfByPL12M2dx0/bpnfwHX334XXq/2oTn3lhubHI+JsfLUsiXcPn8RjtpaYu12Xnt2JX+76AJunrOAEyafg8ViYfk/78Fmi2nS944br+W62+cw5vRziYuNZfn997TqHPUw1MZWCJECvAbcIKXcptdO2dgqFAeT9vUwnKkW6v6XTYy5LtrhhISysTWeqNnYSinLhBDrgEmAbiJXKBQH+H6jjaEfnIn5fCdxtS7oYEk8XJSNrXEYoVrJ9K3EEULEAqcCP7d2XIWiK7B5g537Z2TwzOZbMCW58FZaox2SogNixIq8B/B/vn1yE/CSlFL5aioULfD9lzaWzUigb+qP/G3UQkyxHrwVMS13VCia0epELqXcCow0IBaFosvw0zcxLL4xgT7Ju/nH+CtITCsFUCtyRVioR/QVigjj9cJzS1PItueyYPzfSLKV4S21UfHMIPB0oid/FBFDJXJFxOkqBlh6mEzw2O272b/6b6TENtI115mjF5SiQ6O8VhQR5fM1bzDj9PEsvOYuZpw+ns/ffSPaIUWMnO0WnrkvhT+VPID7vTNJjztQGMI6qJyYEUVRjK7zsXd/AX+97uaQ+82YNY+ft+8M2OapF17iv6+2n/euWpErIkZjAyyc2uP2K+aPY9ioMZ1+ZZ7/m4WFV2cSV17A87XfkB7X9LilfwWmeDd1WzKiE2AnpEe3LP7vsQcOer0l29hli1q2i7q82WP/0UYlckXEaDDAch5sgNWZE/m+HDP3Xp2JMMHcyZeTHldwUBtTkgtvWddSrETCxvb5l1fzxbuv8cLLq3lv3SfUOuuoqXGw+rmV3PqPhXy+6Wv69MrG6/Vy0XnncNbkCUz5y2XcfcctjBx+OL2OOI6r/noRaz9eT6zdzvOPP0xWRgaLH15OfFwcN1x5Kb/tyuHmuxZQVFKK2WzmmUeWkpmRzoVXzaCsogKXy8Wcm2/g9NNONuKy+UVtrSgiRlMDLOjMBlj1FO7RkrjHDZP7vkZ20i4/rSSmRFeXkh6+8tY7HHPaRK6740qOOW0ir7xlvI3tyOGHN2nz1ebv+Nf99/LG80/y5toPyMnL57N3XmXZovl8tfk7v+NW1zg4ZuRwNrz9CscfezTP/veVg9pMv/kOrrhoGhvefoW1/3uOblkZ2G0xPPevh1j/xku8+fxTzFm4JCiTrXBRK3JFxKg3wFoxfxxmSx887pzOa4Dlo3ifdgNz/f1Lyf3oab9tRKwHYZFdRnpYVFzCzLnzWLq0lgEDYOdOmDlzHmOPHx32yryxjW1RSSnJSUn07tmjSZtxY44nNSUZgI1fb+bs0ydgMpnolpnBiaOP8zcsMTFWJp08FoARw4YeVPqtsqqavfv3M2WiVjDbbrMB4HK5uHvpw3y+6RtMJhN79xdQUFRMt8y22TpTiVwRUbqKAZarDqwxcOhRdeT+3+28/4z+ilPEuZEugewiiTwnfw89ulsYMED7ecAA6N7NeBvb5sTFHbCNDXZ1bLVYGixszWYTbndTIzO9cf73+tsUF5ey7vUXsVqtDD9pIs5mRSeMRG2tKIKiorSYnT9sMaQyT1JqOgMOH9Fpk3hFqYk7L+zGBy/Hk5C6KmASB/AW26l8ejDu3PgIRRhd+mT3ZO8+Nzt9wpCdO2HffuNtbAMx+piRvPHuB3i9XgqKitjw5VdhzZmUmEDP7t15+70PAXA666hxOKiorCIjPQ2r1cqnX2wiN39PWOMHi1qRK1qkK9XMbC1V5YJF12SwP89Cz35u5OynguzZdR4EykhPY+mC+cycOY/u3Szs2+9m6QLjbWxz8vJ125456TTWf/4lJ0w+hwH9+nL0kUeE7RP+7yULuWnOAhY+9BhWi4VnHl3KeWf9kWnTr2f8WVM5YuihDB5wSMsDtQJDbWyDRdnYdhwqSouZcfp4TTLoq9ATYxvHsnc+7rQr6nCpqRQsvCaTnO1WbnmoiHN7F7F31bkt9osZUYywu3FuDM0Gtj3REW1sq6prSIiPo6S0jFPOnca7Lz3XZnvY4RA1G1tF56OrSgZDxe2Cf87IYPevVm5aUhx0Egew9K5quVEnJNo2thdceR3lFZW4XC5uve6qdpXEQ0UlckVAulLNzNZgscKoUx2cflEVJ531NHuD3lIBU6IL9564lhsqDOWtF/yriDoi6manIiBdqmZmGNQ5IXeHth6afGEVx53iCGFfHDB7EfHujq8hl9421Ul3NaSUIIOv16pW5IoW6SqSwVBxu2DZ7en89K2NB1/fR1Kqlw03rmFir+DHMCW4EIIOLz2sK8ylIj2dJLvVb8V5RfBIKamodVFXmBt0H5XIFUGRlJreLhN4tJwUPW54dHYa334Sy2WzShsl8YO9PQJi9eIpjcFb3rFX5MXvPA5cRVFmbxDqi36rkF7qCnN91zQ4VCJXdFiiJYv0euBf89LY9GEcF91cxmnnVbN062Tm9gq96r23KJbq//Vvgygji9dRQeEr90c7jC6L+uhUdEgaOyk6qjZT51zHivlzDHlgqSU+fDWez9fEMfX6ck6/SFOczF0behJXKIxCrcgVHZJoyiLHn11NUqqXUac6AIi//7Swx7KP2QcWSe36Hi03Vih0UCtyRYck0k6KUsJbzyZQXmxqkBpC65I4gLmbAxGrVvOK1tHqRC6E6C2E+FgI8ZMQ4gchxI1GBKZQBCKSskgp4cVHk3jhoRTWv3HAD2Xp1smtHRlTkgtZ0bEVK4roY8TWihuYKaX8VgiRCHwjhHhfSvmjAWMrOjD5v29nx7bNDBw2kuxDBhk+fqRkka+tTOSNp5M45c9VnHFpJQAJqatavS8ubF5EjBdvZcdWrCiiT6sTuZRyL7DX9/+VQoifgGxAJfIuzNOL5/H+S6uA3kAuE6ZO49LbWy6hFSptLYt845lEXv53MiedUc1ld5QhhJbEQ3roRweRWAeAV63IFa3E0D1yIUQ/YCTwpZ9j04UQXwshvq4sLTFyWkU7I//37b4kvhH4BdjIey+uIv/37VGOLDScDsGnb8Zx/MQaps8txWQyLolrCNx5cV2uxJvCeAxL5EKIBOAV4O9Syormx6WUK6SUx0gpj0lMjZ5RjqLt2bFtM9pK/ICiBHr5Xu8YSAm2WMncJwu5ZkEJJq3QDyPHLDNsDm+RnZp3+uAttxk2pqJrYkgiF0JY0ZL481LKV40YU9FxGThsJJBLY0UJ5Pleb/988mYcj8xKw+2CxBQvFt/Ox9Ktk/l2bHie1f5R3iQKYzBCtSKAJ4GfpJQhPp+s6IxkHzKICVOnAaOBwcBoJkyd1iY3PI3m83djeXx+KlXlJryNPIuWbp1s+EM/sRPziD1Vv/iBQhEsRqhWxgAXA98LIbb4XpstpVSVI7owl94+n9POv6hNVStGs+lDO8vvSmPIiDpmPlBMjG/Hoy2SOIA5pQ5Pod3wcRVdDyNUKxvoSnWqOjm/bPmKrRvXM2wO0mYAACAASURBVHz0WIaMOLZVY2UfMsiwBN7W5libP7XzyKx0Bhxex60PF2GLPbDtsXp2mcFbKoCQiEQX3t+SjB23E1Je66ag2kVWvJVke3ApK5w+HZnOf4aKoFl4zSVs+3Ij0IvXVqzgiNGjmbX82WiHFRFzrPgkL4ce5eSm+4uJjT+QxE+ccrzxSRwQ8S6ESUkPW+LTnHIe37yPbpmC/YWSq0Z058S+yYb36eioRK4AtJW4lsQ3Ul8J6PuNo/lly1etXpm3hsbmWJqvylZWzB/HsFFjDFmZlxaaSM30MvjIOmb/q4jGVtptlcQBTEkuALwd3Ie8LSmvdfP45n08uEwyYIBk5064acY+hneL111lh9OnM6C8VhQAbN24HuhFU8lgtu/16NFgjsXB5lit5dfvYph5TnfWrdbKrDVO4lPLl7RZEgeQTjN1PycrDXkACqpddMsUDBig/TxgAHTLFBRUuwzt0xlQiVwBwPDRY4E8mkoG832vR4+2Msf67Ucr992QQXK6hyPH1LY6zlDxFtup/aQHskatyPXIireyv1BbVQPs3An7CyVZ8frXLJw+nYHO+11DERJDRhzLEaNH8/3G0WgOC/kcMXp0VLdV4IA51or54zBb+uBx57TaHGv3r1YWXZtJQpKXOY8XkZrZtDbi1PIlvLVibWtDD4zVAy4TSiegT7LdwlUjunPTjKb73YG2SMLp0xkQ0SiY2n/ocHnv80qd2B4xUrViJEapVqorBTPP6Y7FKpn7RCFZ2Z4mxyOSxIH4s3fhrTXjeLdtbHc7E0q1coCzVv38jZTymOavd54zVBhCj779sVitQW9dBEqwRkoGjTLHik+UXHBDOUNG1B2UxAfmVfLWqrZP4gAi0YUsVhryYEi2W0JOxuH06ch0nTNVtEioMr9A7aNVT1OPgnwzJQVmDh1Zx7izaqIWBwAWL6ZYj5IeKgxD3exUAKHXwAzUPpr1NP1RvM/MvVdl8ujsNFx1/tsMzKtk76pzIxKPqd6+VkkPFQahErkCCF3mF6h9W0oGQ6W00MS9V2dQVWHi5qXFWP2o/TbcuCZiSRwaacjVilxhECqRK4DQZX6B2ke6nqYe5SUmFl6dSWmhmdsfKaL/0IO1xBtuXMPEXpH1evOWx+D8Jh1vudKQK4xBJXIFEHoNzEDtI1lPMxBr/5tA4V4zty0rYvCRB++pDMyrjHgSB/CW2XB+kwkuc8TnVnROlPywnWGk0kNvLCOVJpFSrYSD1wN5O630Gez/qb5orMYBTMl1yFoz0tlxEnlnlfN1NJT8sANgpNJDb6yW5ghV5heofVvX0/SHo1rwzH0pTL2+nLQsr24Sj7//NCb2imhoDcROyMNbFoPj/SgFECJd0YSqo6ESeTvBSHMovbH6DjmsTQ2ooo3TIVjy9wx+2RLDqFMdpGX5f/Q+/v7TIhxZYySmRBfunLbzcTGSrmpC1dFQe+TtBCOVHnpj7di2ud2oSYymzgkPzEzn529juPbuEo46yX8S33DjmghH1hQR60FYZIeRHnZVE6qOhkrk7QQjlR56Yw0cNrJdqEmMxu2Ch29N5/uNdqbPK+WESQ7dttHYE2+MKcmnIe8g0sOuakLV0VCJvJ1gpNJDb6zsQwa1CzWJ0TiqTZQUmPnb7FLGnqn/1GZ0t1Q06jXksoOsyA+YUAmuvNTETTNElzCh6mgo1Uo7I9qqlY6E1wNeL1is2qrcEiA3tockDiAS67D0rMG1PQm8HWcdpVQr7YM2Va0IIZ4CpgAFUsphRozZVTFS6aE3VmVZCXm//Yo9Lv6g4/m/b/dbMDkSHzCh4PXCigVatfublxZ3iCQOICtjcP3S8R4E6momVB0No34zzwCPAtEv8KgIyNOL5/H+S6uA3kAuE6ZO49Lb5wc8FglZZChICU8vSuGTN+P501XlmALIsRNSVxH575z6mHtUI2sseMtt0Q5F0Ykw5LudlPIToMSIsRRtR/7v232JeiPwC7CR915cRf7v23WP/bLlK8MMsIww05ISnluSzIevJHDmZRWcO71St21C6irk7KdCjrMtiR2/l5gR0TEPU3Re1HelLsSObZvRVtuN63L28r2O32NbN67XJIvOgyWLoW6LNMgiWzHWqysSeXdVIpP/UsnU6yua1NlsTHtM4pi9iHg33sqOt7WiaN9E7G6LEGK6EOJrIcTXlaVq8R4NBg4bCeTStC5nHgOHjdQ9Nnz02DaXRYYy1sgTaznjr5VcNLNcN4kD7S+JA6YEF0J0HMWKouMQsUQupVwhpTxGSnlMYmpapKZVNCL7kEFMmDoNGA0MBkYzYeo0sg8ZpHtsyIhj21wWGcxYO77XVrH9h7qYdmPgJL506+SQY4sEIlHZ1yraBsPkh0KIfsBbwahWlPwwuugpUwIdi6ZqZc3zCTy3NIW/31/EcacErnh/4pTj+XZs+3z83Tq0lNg/7KfyuYFIh9rVVIROW8sPVwHjgAwhRB4wT0r5pBFjdzVCTXKBknI4JKak0av/YBJTWv+tSS+2UCSW7/8vnueWpnDcKTUcPTZwEl+6dTLxQSRxI4v5hjKW+/dEqiusSEfHcT1UdAwMSeRSymlGjNPVCVWaF0hKGE6fcB0TjYqtOetWx/H0olRGnujg+oUlmFt4t85d625xzE93lbNy0z76mAQ5XsmVo1p28tNz/wvVFVA6LHjy2ue3BUXHpuM8WtbJCVWaF0hKqEegPnrz5/++PWTJYDixNWd/npkn7k3liNG13PjPwA/8AEwtX9LimOW1blZu2scnHslWl5dPPJKVX+6jvFb/A6Cx+9/KZ7w8uEzy+JZ95JY7/b4eaCzroHLMWfo+MApFuKhE3k4I1f2wZSlhaH2MdEwMJ7bmdOvlYeaDxdy8tJiYFp6dmVq+hLdWrG1xzIJqF31MoklUvU2Bnfz03P9+LXaE6AoosY/Zj2VgRYtxKhShohJ5OyFUaV4gKaEegfoY6ZgYTmz1bP7Uzvdfapl75B9qscUGvhm/dOvkoJI4aE5+OV7ZJKpcb2AnPz33v8HpsSG5AgqbFxHjVdJDRZugEnk7IVRpXiApoR6B+hjpmBhObABbv7Dx4C3pvPp4EsGIqRJSVwW1L15Pst3ClaO6c5JZcITVxElmwZWjAjv56bn/9U62heQKKDqYfa2iY6HcD9sZkVCt/LLlK7ZuXM/w0WMZMuLYoMYLR34YSmw/fm3jnzPS6dHHzZ2PF5KQ3PL7cmBeJXtXnRtULI0xUrXyY0ENW/ZVM6J7PEOz4nT7W/pXEHfqHqpe7oe3xB5yzLnlTn4tdjA4PZbeycqnpauiJz9UibyLEUiBYqQ5Vij8+l0Mi67NIKOHh7tWFpKU6m2xT7hJ3EhWfrOX93eVk5UBBUVwWr9krjy6h9+2MUcWYx9VSMXTg8AVmvxw5bfaPJmZUFgIp/XVn0fRuVHFlxUB64ICUavn+cXaWFIzPcz+V3BJvD089JNb7uT9XeU8tly70blzJ1x3bTmTBqb5XTHXbUvFvSsh5CTeMM9jjea5Tn8eRddEJfIuRCDTKsAwc6xgkRKEgItvKeec8sqgknhC6qqoJ3GAX4sdZGXQRLWSmaG97jfBekxhWdf+WuwgMzOEeRRdEnWzswsRSBljZM3QYMj7zcLcv2ZRkG/GZCKoJA7w7iUpbRJPqAxOj6WgiCaqlcIi7XV/xIwswpxdHdY8hYXBz6PomqgVeReiXpmyYv44zJY+eNw5TRQogY4Zyd7dFhZenQmAxxPA/aoZA/MqiY9y8eR6eifbOK1fMtddW05mhpZcT+uX7H+VLCS2o4uo+y4dT3586PP0Tea66xrN01dnHkWXRd3s7IIEUqC0dT3PgnwzC67IxF0nuGtlIdn9g5MPtod9cX8EoyYRCXUk/uU3HOu74/olvG8USrWiAHWzMyqEkxT1+hhtjqWHkTVDm1O838y9V2VSVyuY83hR0Ek8WDOs5kSiYHDvZJtuYq1PviNHQiLg9T0MFE5cevOEY+ZlpPxS0T5Qv5E2Ihwpn14fIwyoWhOXUdjsXrr3cTP1+nL6DNZ/LL45oTz0U0845lhG0liauLsb/B3tYaBQjbYCEY6Zl5GmYYr2g0rkbUAgmZ/ealevT3r3Ho0MqLTX33txNKedf1HIK/Nw4jKCilIT9jgvCcmSWcuLQuq74cY1TOwV2nyNzbGGe7RH8k/6ch/Du8VHZDXZXJpYUgJuN/zwu6vBaGvAAO3x/ptmhBdXYzOvxmP1S7HrzgGEfF305onUtVQEh1KttAGhGmAF6rN143paa0DVmrhaS2WZiXuvyuDR2aF/UEwtX8LEMG5uhmOOZSTNpYlpaXD1dNiytyZEoy19wjHzMtI0LFLXUhEcKpG3AeFI+fT6DB89lnANqIyIqzVUVwoWXZvBvhwrp51fFVLfUMywmhOOOZaR+JMm5uXDiO7xIRltBSIcMy8jTcMidS0VwaG+G7UBLcn8QukzZMSxTJg6jfdeHA30AvKCMqAyKq5wcVQL7rs+g9wdVm5eWswRo5xB9w3VDKs5DeZYX+6jt0mQ69sLjtRWQHNp4kWXwDXnxDHUFOcz2mq63xxOXAfMvJqOdcDMy/8coV4XvXnUtkr7QskP25D2qlppa4khwIMz0/nmEzs33lfMsScHLtHWHG1fvPV68WgrLXLLnfxWWc0ZCwqo/TKTuu/SDY9LqVa6Fkp+GAWMlPLVV7pvTqCkbETNzHD501UVnDC5JuQkPrV8CfG9wttSaU6y3RLVpJNkMzMgVfNW8TbyIQ8nLj2XRb2x8ivqGto3Px7O/NG+lorAqN9MOyJUaWCg9kZKFoPF7YIvP4jlhEkO+gx2hSQxBO2hn7fa4UM/4VAv2Zs4EYYC3/7qZHiYf20LPt7NthIHmRmwensxh6fHMm9cX93289ftZluxg6wseG17McNaaK/o+Bhys1MIMUkI8YsQYocQ4g4jxuxqhFqzM1B7I2pmhorbBY/ckc5jd6azc1tMyP2Xbp3cLp/cDIfGkr3rZmhbl//6pDhgPU89fiyoYVuJg8eWw3PPw2PL4YdiBz8W1Oi3L3awfDk89xwsXw7bArRXdA5anciFEGbgMWAy2uJjmhBiaGvH7WqEKg0M1N6Impmh4PXAv+am8dXHsVxyaxkDj6gLqf/SrZNbdXOzvdFcsgcQZw9PsrdlXzWZzV0W07XX9dpnZTVrn6nfXtE5MGJFfhywQ0r5m5SyDvgvcJYB43YpQpUGBmrfmpqZoeL1wooFqXyxNo5pM8qYNC00mSHAv9JeMjyuaOJfskdYkr0R3eMpbO6yWKy9rte+oKBZ+0L99orOgRF75NloWaOePGCUAeN2KUKVBgZqn5SabphksSV2fB/Dp2/H8eeryznj0tCTeHs1w2oNRkr2hmbFcXh6LNdd6yAzXUvih6fH6paVG5oVx7D0WK691tFQUWhYgPaKzkGr5YdCiPOAiVLKK3w/XwwcJ6W8oVm76cB0gIzu2Ucve2djq+ZtT+gpR4yUH+oRqP6m3jGj5Yc5v1rpPciFaOZI29I8/pK4nstfOPK3UMcy2mGwvNZFytl51P2UgnV3asPregqUQOf48W9lfJZbyZjeiYzvn9Jin2BriTaN11jJYqiEI6XsarRZzU4hxPHAP6SUE30/zwKQUi7S69OZdOR6ypFImFMFUqa0ZVxSwv+WJzHwiDqOOsm/vHDjmtX834Jb6WO1kuNyccm8JRw/6cCO29TyJQc9ufnEV3v5YEe572zg1EHJXHFMj7CMnvTqaeoZQIVSfzNYRJyLxIt24vi0G66ftEQ+f/1uthVpipKCAhoUJYHOMdRzCYeARlsRMM0KxwCsK9KWOvKvgEFCiEOAfOAC4C8GjNvu0TOh6jvksDY3p2qqTGlqppWYktamcb3y7yRWP5nExGmVfhN5RWkx/7fgVj5x1jLcWauZM82/hcNH/aFhnhvmHs7ERnrx3HInH+wob3Q2MHp7OSf0SQ7Z6EmvnuaY3sl+DaDSY60h1d8MFlOidnOzXkP+Y0EN24o0RUn9PNde62BTXqXuOVY4PSGdi5EGXPVGW21tmhWOAVhXX5k3p9U3O6WUbuB6YC3wE/CSlPKH1o7bEdBTjuzYtrnNzakCKVPaMq7VTyby6sokxp1VzcUzy/22KdyTSx+rtak5k8XaMI8/M6xfix1+zkZTW4Rq9KRXT3PLvmq/BlBb9lXr1t9sDaYkLUZZqckx9RQlX+ZX6Z5jqOdipAFXvdFWW5tmhWMApmiKITpyKeU7UsrBUsoBUsp7jRizI6CnHBk4bGSbm1MFUqa0VVzv/CeBlx5LZszkaq6YU4pJ592T2bM3OS5XU3Mmt4t+h33FiVOOZ8+FrxzUZ3B6rJ+z0dQWoRo96dXT1DOtGtE9PqT6m8EiEl1ICd5KbfWopygZlZ2ge46hnouRBlz1RlttbZoVjgGYoinq+0kr0FOOZB8yqM3NqbIPGRRQmWJ0XFLC/jwLx51aw9XzSzGZ9dsmpaZzybwlnDT/FnpbrOS6tT3ycWcubmhz1PoqFg2Y27Ay751s49RByYzeXu47G22PfGhWXMhGT3r1NIdm+TetGpoVF3z9zVCoM+HJjwOv9omnpyg5rlei7jkm2y0hnYuRBlz1Y7W1aVa4BmCKAyjTLAMwUrUSKoHMtIyKq64WYuxaMvd6wBzk31H9PGfcMp10s//M35lVK3qEo1ox8rrooVQr7R9lmtWGRMKESg89My3QjyuUeD9bE8uLjyYzZ0UhWdmeoJN4/Twrcy/iUp0kDjBl+sQm6pUkm5k+yTaSbAGW/EESqJ6mPwLNbaTL4NCsuJB13XrnYqSZVaCx9I4ZmWT15lCGXS2jrk4bEc3amEbx5Qex/GtuGoeOdJKc5g2p79Ktk1k9u4wTW2i358JXOArY++/3eGnRKX4leEbW39QbK9Acun0CSOM+yyvj2Ov38fOzgrvfoMWYo11jNByUNLD9oBJ5GxCt2phG8s16O4/OTmPgsDpueagYW2zwW3AJqatYPbsspPlirjyFJ0pLD5Lg9UuxG1Z/U6+WZ6A5wH+dy5ZqY76Zs4/JWXC3U3KDJ3DM0a4xGg6qlmf7Ql3xNqBB/uc8WObXERL5z9/G8PBt6fQd4uK2ZUXY44JP4idOOT6sOXM9Hvq5nAdJ8H4tdmjSPI9s8npBtSvkhNFQs7LZWIHmAHT7aNI47fXm0rgjsgUgid3bcsx6cYVzjpHigGTw4PNvrzF3ZlTNzjYg0rUxjabPYBcnnVHNHY8WEpfY9kkcoLfZzG7JQRK8wemxhtXf1KtZGWiOQH0CSfZM3bTrZt/bcszRrjEaDqqWZ/tCfXS2AZGsjWkku36x0qOPm7gEyRVzQtsaaU0SB0g3m7knJYVxZWX0EZAbY+bKozPpnWwzrP6mXi3PlubQ6xNIGnfaYfE4ndUcUynINRMw5mjXGA0HVcuzfaHkh21IJOSHRrFjm5VF12Qy6lQH0+eVBt0vIXUVI8csMyyOYo+HXI+H3mYzdSs/ZO+qc4H2W+dS73XrkDI8aTX88lZq0DF3RJldR4y5I6Pkh1EgmrLEUNj1i5XF12WSmOrlz9f4f+zeH0Yn8eb0uHoCRz//J95asZYKp4eccid2i6nVGmM9OZveHOHg+iWF3PJYcsodQcccjswu2ok0ErLEaJ9jR0BdlS5O7g4LC6/JIDbey53/LiQtKziZYWu3UvzxuqOaO2vK6J4J+wrh3rgUzrrwFV4vLWGVo4bewEoauSIaKH9r7LzYeA4Ix5lP8uSWvaz9rUJ7gnMLnNbX51gYASlltImUK6PiACqRd2G8XnjszjQsFrjz34Vk9vQE1a8tknixx8OdNWUsfUw2uPzNvK6MniYzqxw1fl0RjZK/6TkvThyURpLNHLIzX7WoY8YjFVxYDFlZPsfC6zTHwraWUkZb/mekLFFJHINHXY0ujMkENywuAQnd+7ScxOsf8mkLcj0eumc2dfnrngHry5y6rohGyd/0nBd/LXbQJ9nmd55A8sOKxGoONWtJvP5YvWNhW0spoy3/M1KWqCSOwaPkh12Qor1m3ngmESkh+xA32f1bLnzclkkcNPnhvsKmLn/7imCs3abrimiU/E3PeXFwemxYznwD+2h/Vrm5B47VOxa2tZQy2vI/I2WJSuIYPOpjrYtRWmji3qsyqSwzccLEGjJ6BF6J19/QbOlR+9aSbjZzb1wKM68ro3uGlsTvjUvhWJudabFxjHbUNLgiTouNI7duDleNmGeI/E3PebHe2yRUZ76Ybtq4N9wAiQk+x8K+4Tk56tFeJYtGyhKVxDF4lPywC1FebOLuKzMpKTAza3kRg4bXtdinfj+8sSxQz8nQCLa76thc52JkjJVB1piAry8aMJeYurl+a1kGIhz3w1D62E/ci6VfFZuWZofschgq7VXR0RXOMRq0Wc3OcFCJPPJUlpm4Z3oGBXkWbn+0iEOPCpzEG2+lvFFTzZyyMvoK2C3hnpQUzoyLNzzGUOeZVLiH7cLbUP8yO97KQ5MGBJzDUNWIjqLC0r+CHG8ltz1cpdQWCkNROvIuzm8/WCnaa2Hmg8UhJfFij4c5ZWWsQzLc9wj9uLIyxtjshq7MQ53nA0cN24W3Wf1LF5vyKjmuV6LfOYxUegSsc/ljHLet3avUFoqIod5VnRwpQQg4coyTh97cR2JKYJ34iVOOb7Ifnuvx0FfAcN8Xt+GgPULv8RiayEOd511HrW79S71EbqTSQ1dRUVOHNdFD92axKbWFoi1RqpVOTK1DsPCaDDZ9qNWeDCaJN8efmVWO1F43klDnmRRr91v/MsZ2se4cRio99BQVPboLhl+XzxEjlNpCETlatTwQQpwH/AM4DDhOSvm1EUEpWk9dLSy9KZ0fv7Zx8jnVLbbXe8inuZlVjm/v2ugbnqHOc2psHAMry7j2Wm9D/cuBXhOPl6/mWxL89jFS6aGrqMjQPiyPjU/jphmlSm2hiAitutkphDgM8AKPA7cEm8jVzc62xVUHD96Sznef2bl6fiknTqnRbRvsU5qRUq2EOs8HjhreddQyKdbOqbGaMqSnz59Fj7ZUVFiHlBE7dh+VLwygrEgotYXCUNrkZqeU8icAIURrhlEYiMcNj8xKZ8uGWK6YY0wSB23FbFQCD5Ss9ebR6zMyxkaG2dJkC6Zx+bh698TGGGn01HwsU5IL6QVZbSHZLlQCNwAlP2yZiF0VIcR0YDpARvfsSE3b5TCZoVsvN3+9rZSTz/W/pdLWroWBCEfKqNenpbF6XD2BZwbMZWKvB1qMyyhzJlNiHbLSClItboxAmWYFR4uJXAjxAdDdz6E7pZSvBzuRlHIFsAK0rZWgI1QEhdcLZUUm0rK8XHhTYCvaaCXxcKSMen0Os1qDGmvWzgV828v/nnk9Rpoz1f2Sgshp2fJA0TLKNCt4WrwaUspTIxGIInykhCfvTeHbT2K576X9JKX6V6e0hWthKIQjZdTrs7nOFfRYR62vCrhvbqQ5kyff+AeluirKNCt4lPywgyMlPHt/Mh+/lsD4s6t1k/jSrZMjHNnBhCNl1OszMsYa0lh7LnyFKdMn+j1mmDmT2Yu5Ww1Yg7MDVgRGmWYFT2vlh+cAjwCZwNtCiC1SSv9/LQrDkRJeeCiZtf9N5I8XV3LetRUHtYmU6VUwhCNl1OszyBoT8lh7LnyFKX5W5kaZM5mS64g/K4ea93vi/j0ppL6Kg1GmWcGjvFY6MB+vjmPlgjROO7+KS28vo7l4KJo3NQMRjpRRr0+4sshvxx68b95adYSlbyVxE/OperUv3qLYkPsr/KNUKwdQXiudkOMnOqitLmPitKqDkvjSrZN58vZithiUMCNFqPOHK4s8an3VQck8nJqZjd0PByS5APBWxrTQK3S6cjIL5/fS1VBXpwPyxdpYRvyhlth4yeQLqw46fuKU4ylxVDO2ef3L2PBkfkYSaA69Y35rebZwLsHgL5mHwspv9vL+rnKyMqBgMyw6JoYRThM4jb31pCR4ipZQibyD8d6L8TxzXyrnXlnBn69puide71qoV//yDzGhy/yMdDkMNAegKzMM9VxCIdxknlvu5P1d5TzWyH2xuKiO2rIYwDgNuZLgdTGkxFrnxVbrpjoxBmkSpBbWkLW3GmeA37d6J3QgPl4dxzP3pXL0WAdnX9E0iSekrmqwntWrf5nrDF3mZ6TLYaA5AF2ZYajnEipHra/SfQpUj1+LHWRlNI3rmafA2TeeIw2JSkNJ8DoBXonN6cFW68ZWW/9fN3n9knHGWuieV8ngbUXaMacbk0949uGU/lQnxpBW5GDwj8UUdNf/FqreCR2EDW/H8cTdqRx5Qi0z7ivG0kiB1Vwf3rj+Zf1qcV8R9E4JTuZXX0neaJfDlubwd2xkjDXkcwmHUJ4CBa2eZ8HmpnF99TVckJICBu56NJbg1c+zv1CSdZSS4EUTk0fLtl6zCZvDTdaeqoZEXJ+sfz4ig9LMOHrkV3HshvyDxihLs+OMteC2mKiNtVCRYsdpN+O0W7T/2rT3+G+D09g5JA1MAlb97Dcelcg7AHW18NJjSQw9xslNS4poVAHN70M+evUvw5H5GXnDs6U59GSGoZ5LuMzauYBFBJfMeyfbOK1fMtddW05mBlTXwPV/jqWP3Yx0GBeTkuBFCCkxu2XDatnm9FCVGENVsg17tYthmwsaVtQxtW5iXF42j+pObv8UYmtcjNy0DwC3RfgSsQWTV/sWVZZmZ+vR3ZomabsFt1W7l1LUPZ6iAKttaW55q07JDzsIhXvMJKZ6scce+H219KSmXv3LQERCtfKVs5b1tU7G2m0c69sfb2n+SKppWnJPbEy9amXEcMEhf9lL9Tu98OSFfwNVj66sWmk1UpJe6DiQpH3JuDgrnvx+ScQ43Zz6+k4snqa58KcjMtg+LANbjYsTPs49kIht2n/3ZydQkWrH5PFid7hx2i14LG37jKWSH3ZAvvvMxvdfq8HGcQAAF5JJREFU2rnwpnIyex54WrBxKTY9GitA7glBgWKky6E/5pWWsMpRQ29gRXUl02LjmJ+a1uL8bR1XY/Zc+Ao9gtwz751so3eyDWsPzd9GtoH0EJQErx7hlcT49pulEFSmaAWvh3xfSGy1q9EetIf92QlsPVaziTr+45yGvWevgDqbmdo4bXuqzmpm98CUhpV0rd1Mnd1Cje8JUmeclY//2F83Jq/ZRE1C2/zeg0W9M9opP2yy8cAtGfTs58LpENjjtNVC45uaekSqzmaobHfVscpRw0YO7IOPdtRwUUJC0N8YIkWPqyfQA1gU5L65SHQhJXgr1Z9UONhqXNgd7iaJ2G01sWtwKgCj1ueSUlxLjNPToAkq6B7PxvG9AeiZU4nZ7dUScayF8lQ7JRm+h7KE4PPxfXDFmHHazdTZzDR58MIk+OGobhE8W+NR77p2yM+bY1jy93S69XIza3lRQxIP1vQqUnU2Q2VznYvevnjq4+rle729JfJ6gt03NyXVIast4FX2Rdp+s5eYOi8O36o2K7+KlJLaJjcD3RYTX47TEvHRX+who6DpzYXSNHtDIi9PseOIszbZ3mi8Cg60YgYoyYoz8gzbHSqRtzN2bLNy/4wM0rp7uPPfhQ0mWKE4F0ZCgRIOI2Os5NI0rjzf6+2ZRxb8wFsrArcxJbrwVrTv82gVjfTNDTI6p5vfB6WCEBzySwm9dldgq3UTU+vB4pG4LYJ3zhsCQK/dFfTaXUFdjOnAFkbsgfTz6+EZ7DzUi9Om3Qysa7bf/PORmRE/5Y6ESuTtjPJiM2lZHmb9q5DkdG9Y1rORqrMZKoOsMUyLjWO0o4ZeaEl8Wmxcu12N19NSxSEAx0c9EdbAxa3bG8IrtfoXQhBXWUdakaOJ1jnG6eHb43vispkZ8n0RQ34oPmiM3H7JuGO095XLaqIqMY46m7khWSMlCMF3x3Zj8+geSJN/BUYg1YaiZVQibyfUOgT2WMnRY2sZMaYWs0W7qRmua+GZcfGMsdmj6pvij/mpaVyUkBCymqY90OPqCaCTzGW1lfZQLcXk8TbZZy5Nt1Nnt5Ba5OCQX0qaaJ1jnB7WT+pHRaqdzH3VHPn1fgA8JtGwhWFxe3HZzBT0TPDtMVuayOjqJXS/D0nj9yFpunF5rO3j/ddZUYk8ClSUFlO4J5fMnr1JSk0n/3cLC6/O5OKZZYye4CA50xjr2VDrX0aKNJOZwVbtvx2N5g8Olde6KRUO+oysxbw7BVndNtsrZreXpNLaJknaVusmt38yZemxpBXUMOqTPKyupt8KNp7Ui4LsBCwuD6kltTjtFqoTYyjJ9G1h+FbTe/okUdQt/kBybubCVpoRS2mGcnRsr6hEHmE+X/MGKxbMwWzti8e1m6nXL+OtZ6fh8UDvQZp7Xltaz0bCGKs9z28Es3YuoOeCP3H77JdYuWkfk0bB8D9IPv8Bhokg9nIb7Te7rSZq46xY6jwM/Kmkyc1AW62b7UMz2D0whbgqFyd+kNNkGGeMmeKsOMrSY6mNs5B7SPJBD51UJWnfeAp7JPDhGfr6dpfNjMvW8T5YFRoqkUeQitJiViyYQ51zHTiHAz/x3NIE4pMkc58oYshRz7VpEo+2LDHa8xvJ9xe8xFNlhXzikaRnwXbgtQ+KGX5EHOlSNiTjqiQb+7MTMHm8nPjebmxO7WEUk28fZvthafw0IguAgT8VN9lfrkqMoSZO+xOtSbDyxbheTW4GNt5vrkmIYdvRHVtCpwgflcgjSOGeXMzWvr4kDnAYUMklt37OX/5+YZvPH21ZYrTnDxkpMXm9eH2xxdbUYPG4MXm9CJeLNXVuhgM7eoDJCR8UQfLHuU2GyDkkif3ZCXjNJqoTrJq/hm/FXGezUJ6qPdDitpp4a+qQg7Y06vFYTBT2MP6JUUXnQCXyCJLZszce124OCPD2YbFezGfJeRGZP9qyxGjPj5QIKTF7PZg8Xi0hI3HEahrj5PIyYlx1mDxerY2UOGNiKMzQVsxJVRVY3W68QhBjMpEH7Adqu4PYC7cKuPDY7piTYhq0zvU3AwG+PrGXfmw6CVyhCAaVyCNIUmo6F9+yhGf/eRWWGAcez+88YLdy1uLI3ESKtiyxTeb3ydsALC4XVrcLs8eDyaslYySU+iwA0kuLia2tbdLdbTY3JHIhJRKBy2ql1mzHazLhthz4EylMz8RrOnAj8JuaaiaXlbGsh2TfXkg+vgflquCDIgqoRB5BqioEH75yEQkpF3HD4g84d/YVEd9SiLYsMaj5fVsa9Stnp80GQmB3OIitdTS8bvZqCTu/RzYIQUJ1FQk11doQgNdkwtNo/JrYOJwxNu11kxmvWftvPWUpqQFj9zaLteFc5ro5PMFEZo2Zb/uGf20UinBpVSIXQtwPnAHUATuBy6SUgY1Auig1VYL7rs8kb6eVpxIvYfxd6yBK+8KRNKBqjPB6sbjdZHs99PZ4MTtrMXm9VCYk4jWbia+uIqmyArO3qYRuT7ceeM1mLG43tjpnQ4J2xVibJOLKhESq4hPwmkxNVs711K+8G1whzSYGtbKWabrZTDpmqNF+bm35OIUiHFq7In8fmCWldAsh7gNmAbe3PqzORW2N4J8zMtj1s5XHE69gvH1dtENqPY32mz0mM9Jkwux2E19TjcnrbbKiLk1NpS7GRmytg7Sy0ibDeIWgJi4Or9mM22LBYY/FYzYfWDXXJ2WgKjGRqsRE3ZA8lpbfzvPK/7+9e49uu7zvOP7+6u67LVuucyNAm3ELIckYI7C0aWGQdCl0hUEgQEo30gwotB0rJKEw0pbLKFvXcacwyjChjIxQQlkIKwucjXANGGgSSmgpIQnx3fFN+kl69odkYzu+SJain37y93VOzkGWLX1/B+tzHj+/53m+LdRb3Yk+m02w1FvMDRUjb2SB0ZdMRuos2k/rovKZUryNifcfT8chpTKRUZAbY54d8HALcHZm5RSm9feX8d5bHu6svJTTi54d+wfskpzSGBjC7niMsN+P5fXhsSyCbS2J52OfnkLXXBWkp6gYTyxKWef+/vCNuRKjZpMcGYf9fpqC1f0BHXMPPoUu7A8QHnI+eTb91opQb3UP6rN52aXdXGCNfPriWEsmw4datJ/eSfmvB6+FT7fjkFKZyOYc+TeAX4z0pIgsB5YD1NRNyeLb5r8Lv3c/5z75Kp8PvJj7N0+OnI3LBcZQ3NPdH8R9gd1dVEx3cQnuWIxJ+/Ye8BJt5RVYXh9GhLjLheXx9gdx3OUikgzBsM/fP189nJjbQ8xt322ZrRHrgD6boRrY2jXy6YtjLZmMhqIAeBsPnKJJp+OQUpkY81MlIs8BdcM8tdoY82Tye1YDUaB+pNcxxtwL3AuJDkHjqtZBohasu6ecH/7qJCpd7ZDNgaYxg4I4Li4ifj8YkxgxD7gR6I7H6Swpoa0icSOvb2rDQH8Q9x0SEnO7aSuvGDy14XYRl8TURszjoal6lJ2Leb6Ebo7Py76mwX02G5tgTsXI2+rHWjJp1cZwt7twhYc/vrZvF2iqHYeUGo8xg9wYc+poz4vIMmAxcIqxo29cHopF4Y5rg7y8qZhTKxfw1eInU/5ZbyTSv+mkL6xjbjf7y8oB+Mwne/HGooN+picQoDm5ssMdjYEwaNTcN2JGhD21dcRdrsR0x9DgFaGzdOQ5aKeb4fWx1FvMZZd2E6pJhPhS7+inL461ZNKqjeJpHP1jtHvpOhan0T5OqXRlumplIYmbm18wxnRnpyRni8fgnn+o4pVNAW4svYazvY/jisSJ+BI7+Eq6OgdvOonHibncNIYSm06q2lvxWYkzV/qW0IX9/v7X7yopQYwZtHxu4BK7vtcZSSo3BAvZDRVBLrBK2dplMacitdMXR1syGQ8YvJ+MvfIlnfZxSqUr00/17YAf2CSJ0d0WY8yKjKvKY762Vkr2fkyguZFASxP+lmZ8+9tpuPxq4nHwXngtj23fSC37cHfGoRNiLhd76iYD4A+H8UfC/dMXlsc7aNNJa3Itc98NwaGj5kIeMefKDK8v7eNzR1qyOe36Woyk9odouu3jlEpVpqtWPpetQuzi7ukh0NJId+0kjNdL8J2t1G15kUBLU39YB1qa2fjwBmJFxRxz/085sv5ng14jGgjw9je/S9z1K17bcRRTPTsoCXT1T20MXOvcEqwetR7LQedzqwQx6d0bWLlzDW9M1bXmKnsK7+9sY/B27k+Olpv6A3nXKV+mtzrE5Bf/m6MfuL0/pL3JnYBPrX+BzkMOo3brKxx3561ESsvoDdbQG6yh/fAZuCNhYkXF/P4vzqJxzgn0VoforaqmtzqEVVTC/K+chAjM+UwFFdJOh+hW7ULXe3iE1jM6qHmkEu++9D5Ki5efrnPmKmucEeTxOBKLYbxefK0tTHr5BQLNTZ+GdXMT715yJc3HzmHq8//F/KuWH/ASHYfNoLc6RNztJubz03LMcfQGQ/RWJ8I6UlEJwG/Pvoj3zllGfIT1zK1HzqT1yJn9j0ur1vLisX42xG/hpoqViRUqakIIT4/Q9Se91Dyc/s+m0j5OqVTZFuRiWQRaE9MWgeZGOqdOZ//0wynat4fZ/3IT/tZEQAdam/G3NvPq6pv54KtLKP34Q05a9S0A4h5P/6jYkxxZtx5xDFu/cy29VTWJkK4O0RusIVyVmNLYe9IC9p60YMS6YkWpH2B1W8Mivviti/jXzis4v7geyYtmXypXoqEYRMHTPP7jDkZrH6dUqmwJ8qr3fsOSPz180NcaLr2Kd//mShCh5q3X6A3W0DV5Ks0zZ9MbrKHtj44CoP1zR/L047+mt7qGSFkFuAav3+2acgjbL/zmQb+G2xoWsfCKc/nR/r/nrKLHualiJa4Ub3qpwmDVRvE2edKeIx9Kd4GqTNkS5OHyShrO/XpiDrq6hnCwhv3TDgWgJ1THUxv+b8SfjQWK6Dh8Ro4qPVBpVaKf5s6uZXy/41q+EvglP668ylEhbnfPzkJhhaJ4htnROR66cUhlwpYg766bzLvLv23HW2esrxXboe7fc2bRev658jt4JGZzVakrhJ6Z+cLd6cb3UfY+QrpxSI2XM2525oHbGhaxflUbH0WnMs2ziwWBzSwIbLa7rLQUUs/MfDD51pqsv2bfTVA9ClelY/gDItQgfSH+VM9iPr/vBTb1jnpqQd7qPwAq+XjgAVAqv8zd3Gl3CcpBNMjHMH/xPNavamNjz2lc0fpT5vi2crLvf+0ua1wGHgAFNvTMLCBds3r5aM0nWKHo2N88ThrmKlUa5KOYv3geAM/3LuBvW+/iWO/b/Dy4jGJXj82VjU//AVAIs0VYgOS0Z2chiUyxCH/WwtV1cD9Cczd3snHXdw/qeyjn0znyYfQFOMAfotO4pOU+jvDu4KHqiyhzOXuUZHfPzkIRrY3i6hLc3Qd/LKTnmqux6Ih8iIEhDnCI5yPWVFxHfXBpwezarHa7me3zaYhnwKqNpb0tPxMrd65h0nn/mbP3U86iQT7AwBDfGpnN25HEVvzzS9YSdLeO9GNqAkqsIc/tH7STVpym0yxqWBrkJDb5DAzxtyMzuaD5Ya5pvxltlaGG4/+dj6LtuT+pcuXONRrm6gAa5Hy6yQdgm3UkS1vqKXd1cG/V8nzvXqZsUndXkMqN9pwNv3LnGhYvP92W91b5aUIH+fzF8waNxN+3Psv5zY/gJ8za6vOY4tltY3UqX5k8OBxt99J1Omeu+k3YIL+tYdEBX7u7awWC4dGaJRzq+dCGqpQT7P+zbn53526s6oO3hjwVk1acxtzNnRroauItP+w79Gr+MM/dWLGKPaWTmO75Q87rUs5h1UaJlcXxtOfHqh89PVFNqBF5X4gPtCdWx/KWe2iJVeETS0NcjSkaiuFpcSPR/LmBsnLnGrtLUDaaMCPyoevDAfbFQixpepR98Vp2xabqEkOVEqs2e8fXZtPczZ1M1tMTJ6SMRuQi8gMRaRCRN0XkWRGZnK3Csmm4EG+JVXFe81r2xCfx8+AyZvnetqEy5US53gyUDr0JOjFlOrVyqzFmljFmNrABuC4LNWXNbQ2Lhg3xtngF5zc/wofR6fxb8GJO8L9qQ3XKiQyG0i1FFL81fE/XfKAbhyaejILcGNMx4GEJ5MG6rKTSqrWsX9U27HM9pogoHu4LXsLJ/pG7ESk1lCCE6ispe7nY7lJGpWvNJ5aM/z4UkR8BFwHtwBdH+b7lwHKAmropmb7tqIYbhQP0xAP4JMIk9142hk7HLfGDWocqPHFfHIzgsvLnRudItOPQxDHmiFxEnhORd4b5dyaAMWa1MWYaUA9cPtLrGGPuNcYcb4w5vqwqmL0rGGLEEDcBvt7yIFe1/RhAQ1yNS8cXuvngwY+JljujGcfupet0ZD4BjDkiN8ak2g7nEeBp4PqMKsrASCEeNj4uabmPlyLz+EmlM3uFqvwQrY0iYcHd4ZyVu9o+rvBlumplYDv7M4DtmZUzPiPd1ASIGC8rWu5mc3gB/1jxPb5W/ESOq1OFxApF8Ta6EfJ/amUo7ThUuDIdVtycnGZpAE4DrsxCTWkZ7aYmwNVtt/Bc+M/5YcVqlpT8IoeVqUJk1cbw5OnSw1RomBemjH4jjTFnZauQdA23S3M45xQ/xixvA8tKHspBVaqQGQxWbZSi7X67S8nI3M2d3KRb+guKcyb6hhgtxONGeCl8IgDz/Fu4uPTBHFWlCpoLguvKKXktf9eQp0o7DhUWxwX50KNnhzIGvt/+A85p/g/eiMzJYWWq0ElcqHqmjOLfOD/IQTcOFRJHBflwR88OZAys6biOh7qXsaLkLuZ4t+aoMjURRMtjWKEoRvJm31vGtONQYXBEkPe1YhvtpqYxcMv+q/lZ1yVcXPIAq8pv1O4+Kqs6FnTx4U/2YnyFE+SQCHO9CepsjgjyVG5qvm79MXd0Xs7S4oe5ofx6DXGVddFQDHe7C1fYER+btOnGIefK69/IoU2RR3O873X+PXgBN1as0hBXB4VVG3X00sOx6MmJzpW3QZ7q8sKHu5byemQuAAsCm3EV0Pylyi9WbWIzUCHrax+n8+bOIsbkPvhEpBFwYlPMGqDJ7iKyqNCuB/SanKDQrgdyd03TjTGhoV+0JcidSkReM8Ycb3cd2VJo1wN6TU5QaNcD9l9T3k6tKKWUSo0GuVJKOZwGeXrutbuALCu06wG9JicotOsBm69J58iVUsrhdESulFIOp0GulFIOp0GeBhG5VUS2i0iDiDwhIpV215QpEfkrEXlXROIi4tglYSKyUER2iMj7InKN3fVkg4g8ICL7ROQdu2vJBhGZJiLPi8i25O9czhvRZJuIBETkFRF5K3lNN9hRhwZ5ejYBM40xs4D3gJU215MN7wBfA16wu5DxEhE3cAewCDgaOE9Ejra3qqx4EFhodxFZFAX+zhhzFHAicFkB/H8KA18yxhwHzAYWisiJuS5CgzwNxphnjTHR5MMtwFQ768kGY8w2Y8wOu+vI0AnA+8aYD4wxEeBR4Eyba8qYMeYFoMXuOrLFGLPHGPNG8r/3A9uAKfZWlRmT0Hd0pDf5L+crSDTIx+8bwDN2F6GARBh8NODxLhweEIVORA4F5gAv21tJ5kTELSJvAvuATcaYnF9T4R7lNk4i8hxQN8xTq40xTya/ZzWJPxPrc1nbeKVyTQ433HmXuq42T4lIKbAO+LYxpsPuejJljIkBs5P3zJ4QkZnGmJze19AgH8IYc+poz4vIMmAxcIpxyCL8sa6pAOwCpg14PBXYbVMtahQi4iUR4vXGmII6M9cY0yYi/0PivkZOg1ynVtIgIguBq4EzjDHddtej+r0KzBCRw0TEBywBfmlzTWoIERHgfmCbMeaf7K4nG0Qk1Ld6TUSKgFOB7bmuQ4M8PbcDZcAmEXlTRO62u6BMichfisguYB7wtIhstLumdCVvQF8ObCRxA+0xY8y79laVORFZC7wEHCEiu0Tkr+2uKUMnAxcCX0p+ft4UkS/bXVSGJgHPi0gDiQHFJmPMhlwXoVv0lVLK4XRErpRSDqdBrpRSDqdBrpRSDqdBrpRSDqdBrpRSDqdBrpRSDqdBrpRSDvf/pPn0GhogvtAAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "print(__doc__)\n",
    "\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn import datasets\n",
    "from sklearn.linear_model import SGDClassifier\n",
    "\n",
    "# import some data to play with\n",
    "iris = datasets.load_iris()\n",
    "\n",
    "# we only take the first two features. We could\n",
    "# avoid this ugly slicing by using a two-dim dataset\n",
    "X = iris.data[:, :2]\n",
    "y = iris.target\n",
    "colors = \"bry\"\n",
    "\n",
    "# shuffle\n",
    "idx = np.arange(X.shape[0])\n",
    "np.random.seed(13)\n",
    "np.random.shuffle(idx)\n",
    "X = X[idx]\n",
    "y = y[idx]\n",
    "\n",
    "# standardize\n",
    "mean = X.mean(axis=0)\n",
    "std = X.std(axis=0)\n",
    "X = (X - mean) / std\n",
    "\n",
    "h = .02  # step size in the mesh\n",
    "\n",
    "clf = SGDClassifier(alpha=0.001, max_iter=100).fit(X, y)\n",
    "\n",
    "# create a mesh to plot in\n",
    "x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1\n",
    "y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1\n",
    "xx, yy = np.meshgrid(np.arange(x_min, x_max, h),\n",
    "                     np.arange(y_min, y_max, h))\n",
    "\n",
    "# Plot the decision boundary. For that, we will assign a color to each\n",
    "# point in the mesh [x_min, x_max]x[y_min, y_max].\n",
    "Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])\n",
    "# Put the result into a color plot\n",
    "Z = Z.reshape(xx.shape)\n",
    "cs = plt.contourf(xx, yy, Z, cmap=plt.cm.Paired)\n",
    "plt.axis('tight')\n",
    "\n",
    "# Plot also the training points\n",
    "for i, color in zip(clf.classes_, colors):\n",
    "    idx = np.where(y == i)\n",
    "    plt.scatter(X[idx, 0], X[idx, 1], c=color, label=iris.target_names[i],\n",
    "                cmap=plt.cm.Paired, edgecolor='black', s=20)\n",
    "plt.title(\"Decision surface of multi-class SGD\")\n",
    "plt.axis('tight')\n",
    "\n",
    "# Plot the three one-against-all classifiers\n",
    "xmin, xmax = plt.xlim()\n",
    "ymin, ymax = plt.ylim()\n",
    "coef = clf.coef_\n",
    "intercept = clf.intercept_\n",
    "\n",
    "\n",
    "def plot_hyperplane(c, color):\n",
    "    def line(x0):\n",
    "        return (-(x0 * coef[c, 0]) - intercept[c]) / coef[c, 1]\n",
    "\n",
    "    plt.plot([xmin, xmax], [line(xmin), line(xmax)],\n",
    "             ls=\"--\", color=color)\n",
    "\n",
    "\n",
    "for i, color in zip(clf.classes_, colors):\n",
    "    plot_hyperplane(i, color)\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
